概述
SViewFrame for Android 在SViewBase的基础上增加了模型属性操作、动画播放,测量,批注,漫游等功能的操作界面, 方便用户快速集成。
仅需要基本的浏览功能或需要个性化搭建展示界面的用户, 可选择 SViewBase for Android 集成控件。
集成准备
集成之前需要熟悉集成环境以便快速准确的集成相关功能界面。详细集成准备如下所示:
集成环境
SViewBase for Android 开发库集成需要的环境:
- 开发环境:JDK7或以上版本
- 开发工具:Android Studio或Eclipse
- 运行环境: Android4.0以上的设备
集成说明
SDK包解压SDK后得到以下内容:
其中Eclipse文件夹包含了Eclipse开发所需要的工程文件,Android Studio 文件夹包含了Android Studio所需的文件,
Demo包含了Eclipse和Android Studio演示工程。接下来分别说明如何将控件集成到您的Android studio 工程和 Eclipse工程中。
Android Studio集成
控件资源 : Android Studio文件夹下的内容为Android Studio开发所需的SDK文件
打开Android Studio,将sviewframe.aar添加到您工程的libs文件夹下。如图所示:
修改app 下的build.gradle 配置文件添加
repositories { flatDir { dirs 'libs' } }
这个是添加一个本地仓库,并把libs目录作为仓库的地址。
修改dependencies : compile(name: 'sviewframe', ext: 'aar'),其中name就是libs目录下sviewframe.aar文件名称,ext是其扩展名。
添加工程所应用的jar包 : 选择你的project 鼠标右键选择
【open Module Settings】
选择你的module Dependencies 选项卡,选择+号,选择
【File dependency】
找到需要导入的jar包,点击ok
点击Rebuild Project按钮重新构建工程
注意事项
根据您的工作环境不同,可能会遇到以下问题
若遇到aapt finished with non-zero exit value 1 异常,请将SDK的build.gradle中的 buildToolsVersion 设置为与app中build.gradle文件的buildToolsVersion相同,然后Rebuild Project。
若遇到module 合并时的重名冲突问题,请尝试重命名冲突的文件并Rebuild Project。请注意SDK要求java1.7以上的环境。
你需要删除support-v4:23.2.0 .重新添加你环境下的V4包。方法同3.2.2 选择Library dependency。
如果提示:mergeDebugResources AAPT err
你可以在app 下的build.gradle 文件下添加
aaptOptions.cruncherEnabled = false aaptOptions.useNewCruncher = false
Eclipse集成
Eclipse文件夹下的内容为Eclipse开发所需的SDK文件,开发包内容如下。
控件资源:ADT文件夹中asserts包含了控件所需的资源,libs文件夹包含了控件所需jar包和so动态库,其他文件为工程附件文件,用户不需要关心。
资源导入,将下载的SDK导入到Eclipse,具体操作方法为:
File选择
【Import】
,然后打开Android,选择【Existing Android Code Into Workspace】
, 点击下一步,在RootDirectory中填入SDK的具体路径,点击完成。
主工程(开发者自己的APP工程)依赖SDK,打开主工程属性(Properties),定位到Android,然后在Libray中选择Add,选择刚才导入的工程Library工程。
如果自己创建的工程未包含android-support-v4.jar,请从我们的Demo工程中复制。
将Asserts 目录下的SViewData文件夹拷贝到您的工程中。
注意:我们不建议直接将SDK内容复制到主工程的方式,这样后续SDK升级会比较麻烦,也容易遗漏一些文件的升级(比如res目录)
主体功能集成
应用权限声明
由于控件需要SDCard读写,录音等权限,请在AndroidManifest里面加入
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" /> <uses-feature android:glEsVersion="0x00020000" />
代码混淆
如果您的App开启了混淆,那么您需要在您的混淆配置文件中添加如下配置:
-keep public class ht.svbase.model.SShape { public <init>(); public void setID(int ); public void setName(java.lang.String) ; } -keep public class ht.svbase.model.SModel { public <init>(); public void setID(int); public void setName(java.lang.String) ; public void setPlacePath(java.lang.String); public void addSubModel(ht.svbase.model.SModel ) ; public void addBody(ht.svbase.model.SBody) ; public void setModleViews(int[] ,java.lang.String[] ) ; } -keep public class ht.svbase.model.SBody { public <init>(); public void setID(int ); public void setName(java.lang.String) ; public void addFace(ht.svbase.model.SFace ); public void addEdge(ht.svbase.model.SEdge ); } -keep public class ht.svbase.model.SFace { public <init>(); public void setID(int ); public void setName(java.lang.String) ; public void addEdge(ht.svbase.model.SEdge) ; }
控件资源初始化
在创建SViewFrame控件对象之前,需要初始化SViewFrame 所需的字体、图片等资源和渲染所需的OpenGLES版本等信息。
此过程在Android的Application类中进行,此代码可以从Demo工程拷贝,根据需要做配置修改。基本流程如下:
public void initSViewFrameConfig () { SViewFrameConfig config = SViewFrame.getSViewConfig(); config.setApplication(this); String assertDataPath = "SViewData"; String workingPath = appWorkingPath; config.setAssertDataPath(assertDataPath); config.setWorkingPath(workingPath); config.setAppName(Name); int language = SViewFrameConfig.LANGUAGE_CH; String internationalLanguage = Locale.getDefault().getCountry(); if (internationalLanguage.toLowerCase().equals("us") || internationalLanguage.equals("en")) { language = SViewFrameConfig.LANGUAGE_EN; } config.setLanguage(language); config.setGLESVersion(SViewFrameConfig.GLESVERSION20); SViewFrame.loadConfig(); }
由于拷贝后的资源文件存储在SDCard中,此拷贝过程可以在新版本第一次打开时执行一次即可。
可以参考Demo程序的代码进行判断是否是第一次运行。
License授权设置
LicenseManager.setLicenceKey("M2VURUFPMCJEVHJPEgQNHhZDbFRoT1YhQ01JT1VFZGVURUFPPk1GTmheRklrTVNPRC1qT05FU11CWWwJQgA=");
Demo说明
调用方法
SViewFrame控件运行截图如下,包含三个主要区域:
Quickbar菜单,包含复位、视图、着色模式、装配树和漫游等操作的菜单。
CommandBar菜单,包含批注、手势批注、剖视、爆炸、测量、动画和考试培训等操作的菜单。
三维展示和触摸操作区域,通过触摸操作来实现模型的控制。
SViewFrame对象支持通过xml布局文件和代码两种方式初始化,这里提供通过xml布局文件初始化的流程。
将以下代码添加到xml布局文件中
<include android:id="@+id/sviewframe_view" layout="@layout/sview_frame_layout" />
布局预览效果如下图
根据id查找SViewFrame对象
SViewFrame sViewFrame = (SViewFrame) findViewById(R.id.sviewframe_view); //初始化quickBar菜单,需要显示调用,否则可能会出现菜单点击无效的情况 sViewFrame.getQuickBar(); //初始化commandBar菜单,需要显示调用,否则可能会出现菜单点击无效的情况 sViewFrame.getCommandBar();
配置SViewFrame控件运行参数
SViewFrame 支持设置浏览时设置剔除模式、剔除比例、是否显示旋转中心点、设置默认观察模式和默认模型朝向等参数,使用方式如下:
sViewFrame = (SViewFrame) findViewById(R.id.sviewframe_view); if (sViewFrame != null) { SViewFrameParameters groupParameters = sViewFrame.getSViewFrameParameters(); groupParameters.setsView(sViewFrame.getSView()); //------------以下参数根据集成实际情况进行设置--------// // 设置显示旋转中心 groupParameters.setShowRotateCenter(true); // 设置提出剔除百分比为0 groupParameters.setRemoveSize(0); // 设置坐标轴显示位置 groupParameters.setAxisPos(AxisPos.LEFTDOWN); // 设置观察模式 groupParameters.setDefaultOrbitMode(SOrbitMode.ORBIT_3DC); // 设置使用计算属性 groupParameters.setUseComputeProperty(false); // 设置使用实例属性 parameters.setUseInstanceProperty(true); // 设置使用原型属性 parameters.setUsePrototypeProperty(false); //------------end--------// sViewFrame.loadParameters(); }
打开和关闭模型:
通过Uri 对象传入的路径来打开指定的三维模型,代码如下:
Uri uri = Uri.parse(modelPath); sViewFrame.openUri(uri);
当您不想显示模型时,可以使用如下代码:
sViewFrame.close();
SViewFrame对象销毁
当您需要销毁SViewFrame对象时,请调用onDestroy()接口来释放控件管理的C++对象资源。
也可以采取单开进程的方法使用SViewFrame控件,具体操作如下:
在AndroidManifest.xml 文件中加载SView控件的Activity 中添加 android:process=":sview"
<activity android:name=".DemoActivity" android:label="@string/app_name" android:configChanges="orientation|keyboardHidden|screenSize" android:launchMode="singleTask" android:process=":sview" android:windowSoftInputMode="adjustResize"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
在该ACtivity销毁时使用android.os.Process.killProcess(android.os.Process.myPid());
@Override protected void onDestroy() { super.onDestroy(); sViewFrame.getSView().removeListener(readListener); sViewFrame.onDestroy(); android.os.Process.killProcess(android.os.Process.myPid()); }
常见问题
- 集成控件后,能够显示菜单但是模型显示界面为黑色。
- 集成控件出现打开模型空白或者没有授权。
这是由于SViewBase所依赖的C++动态库,没有打包进入您的apk导致,请清理工程重新生成apk再试。
可能的原因有两个:
1).授权时间到期。请联系我们申请延长期限。
2).so文件读取异常。集成初期一般为这个原因,
请检查是否存在多个存在so文件的文件夹:如同时存在x86.armeabi,armeabi-v7a,armeabi-v8a....,建议在性能要求不过分要求的情况下只保留armeabi-v7a即可。
3).运行设备系统为64位导致。
可以在项目的gradle中增加强制使用armv7a下的so文件。参考代码如下:
defaultConfig { //强制使用armv7下的so文件。解决64位机器加载so文件不成功的问题 ndk{ abiFilters "armeabi-v7a" } }查看SViewFrame接口文档